package com.wnxy.d_syn;

/**
 * 1、需求多线程完成售票，要求避免超卖。
 *   比如：只有50张票，意味着只能卖出去50张票
 *
 * 2、这里售票就出现了线程安全问题？
 *   线程安全问题，要满足三个条件：
 *   A. 多个线程
 *   B. 多个线程访问共享成员变量
 *   C. 其中有一个线程修改了共享成员变量
 *
 * 3、如何解决？
 *   A. 上述三个条件，删除任意其中一个即可。
 *   B. java中的锁：synchronize
 */
public class TicketDemo {
    // 总票数
    private static int ticket = 50;

    public static void main(String[] args) {

        Runnable runnable = ()-> {
            while (true) {
                // 这里休眠一下，就能模拟出超卖现象
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (ticket > 0) {
                    ticket--;
                    System.out.println(Thread.currentThread().getName() +
                            "卖了一张票，剩余：" + ticket);
                } else {
                    // 票已卖完
                    break;
                }
            }
        };

        // 模拟三个售票窗口, 用三个线程表示
        Thread t1 = new Thread(runnable,"售票窗口1");
        Thread t2 = new Thread(runnable,"售票窗口2");
        Thread t3 = new Thread(runnable,"售票窗口3");
        t1.start();
        t2.start();
        t3.start();
    }
}
